FastAPI তে Testing একটি গুরুত্বপূর্ণ অংশ, যা আপনাকে অ্যাপ্লিকেশনের এন্ডপয়েন্ট পরীক্ষা (test) করতে সাহায্য করে। FastAPI এর সাথে একটি শক্তিশালী এবং সহজ ব্যবহারযোগ্য টেস্টিং ফ্রেমওয়ার্ক যুক্ত আছে, যা pytest এবং TestClient ব্যবহার করে রিকোয়েস্ট এবং রেসপন্স পরীক্ষা করতে পারে।
এই গাইডে, আমরা দেখব কিভাবে FastAPI এর টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করে এন্ডপয়েন্ট টেস্ট করা যায়।
Step 1: টেস্টিং ফ্রেমওয়ার্ক সেটআপ
FastAPI-তে টেস্টিং করার জন্য pytest এবং TestClient ব্যবহার করা হয়। TestClient হল FastAPI এর একটি বিল্ট-ইন ক্লাস যা HTTP রিকোয়েস্ট পাঠানোর মাধ্যমে এন্ডপয়েন্ট টেস্ট করে।
প্রয়োজনীয় প্যাকেজ ইনস্টল করা:
pip install pytest httpx
httpx হলো FastAPI এর জন্য HTTP ক্লায়েন্ট যা TestClient ক্লাসের জন্য ব্যবহৃত হয়।
Step 2: TestClient ব্যবহার করে FastAPI অ্যাপ টেস্ট করা
FastAPI তে TestClient ব্যবহার করে সহজে অ্যাপ্লিকেশন টেস্ট করা যায়। নিচে একটি সাধারণ FastAPI অ্যাপ্লিকেশনের টেস্টিং উদাহরণ দেওয়া হয়েছে।
FastAPI অ্যাপ (Example)
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
TestClient ব্যবহার করে টেস্ট ফাইল তৈরি করা
TestClient ব্যবহার করে টেস্ট ফাইল তৈরি করা হয়, যেখানে আমরা FastAPI অ্যাপ্লিকেশনের এন্ডপয়েন্টগুলো পরীক্ষা করব।
from fastapi.testclient import TestClient
from app import app # আপনার অ্যাপের পাথ অনুসারে অ্যাপ ইম্পোর্ট করুন
client = TestClient(app)
def test_read_root():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Hello, World!"}
def test_read_item():
response = client.get("/items/42?q=test")
assert response.status_code == 200
assert response.json() == {"item_id": 42, "q": "test"}
টেস্ট ব্যাখ্যা:
test_read_root:/রুট এন্ডপয়েন্টটি টেস্ট করে এবং নিশ্চিত করে যে স্ট্যাটাস কোড 200 এবং রেসপন্স সঠিক।test_read_item:/items/{item_id}এন্ডপয়েন্টটি টেস্ট করে, যেখানেitem_idপ্যারামিটার এবং কোয়েরি প্যারামিটারqপাঠানো হচ্ছে।
Step 3: pytest ব্যবহার করে টেস্ট চালানো
pytest হল একটি পপুলার টেস্টিং ফ্রেমওয়ার্ক যা সহজে FastAPI অ্যাপ্লিকেশন টেস্ট করতে সাহায্য করে।
- টেস্ট চালাতে, নিচের কমান্ডটি ব্যবহার করুন:
pytest
এটি test_*.py ফাইলগুলো খুঁজে পাবে এবং চলমান টেস্ট কেসগুলো চালাবে।
Step 4: টেস্টিং ডেটাবেস (Database Testing)
যদি আপনার অ্যাপ্লিকেশন ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করে, তবে টেস্টের সময় আপনি একটি আলাদা টেস্ট ডাটাবেস ব্যবহার করতে পারেন। FastAPI-তে TestClient ব্যবহার করে টেস্ট ডাটাবেসে টেস্ট করা যায়।
উদাহরণ: SQLite ডাটাবেস টেস্টিং
from fastapi import FastAPI
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# SQLAlchemy সেটআপ
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
app = FastAPI()
# টেস্টিংয়ের জন্য ডাটাবেস সেশন তৈরি
@app.post("/test/")
def test_db_operation(db: Session = Depends(get_db)):
# ডাটাবেস অপারেশন এখানে হবে
return {"message": "Database test successful"}
Step 5: Dependency Injection Testing
যখন আপনি FastAPI তে Dependency Injection ব্যবহার করেন, তখন টেস্ট করার সময় Depends ডিপেনডেন্সি মক (mock) করা যায়। এর মাধ্যমে আপনি নির্দিষ্ট ডিপেনডেন্সি না ব্যবহার করে শুধুমাত্র ফাংশন বা এন্ডপয়েন্ট টেস্ট করতে পারেন।
উদাহরণ: Dependency Injection Testing
from fastapi import Depends, FastAPI
from fastapi.testclient import TestClient
app = FastAPI()
# ডিপেনডেন্সি ফাংশন
def get_query_param(q: str = None):
return q
@app.get("/items/")
def read_item(query: str = Depends(get_query_param)):
return {"query": query}
client = TestClient(app)
def test_read_item():
response = client.get("/items/?q=test_value")
assert response.status_code == 200
assert response.json() == {"query": "test_value"}
এখানে get_query_param ফাংশনটি একটি ডিপেনডেন্সি হিসেবে ব্যবহার করা হচ্ছে, এবং FastAPI Depends ডেকোরেটরের মাধ্যমে এটি এন্ডপয়েন্টে ইনজেক্ট করছে।
Step 6: Test with Mocking External Services
আপনি যদি FastAPI অ্যাপ্লিকেশনটিতে বহিরাগত সেবা ব্যবহার করেন (যেমন, থার্ড-পার্টি API), তবে টেস্ট করার সময় মকিং (mocking) ব্যবহার করা যেতে পারে।
উদাহরণ: External API Mocking with unittest.mock
from fastapi.testclient import TestClient
from unittest.mock import patch
app = FastAPI()
@app.get("/external-api/")
def get_data_from_external_api():
response = requests.get("https://api.example.com/data")
return response.json()
client = TestClient(app)
@patch("requests.get")
def test_get_data(mock_get):
mock_get.return_value.json.return_value = {"data": "mocked data"}
response = client.get("/external-api/")
assert response.status_code == 200
assert response.json() == {"data": "mocked data"}
এখানে, unittest.mock.patch ব্যবহার করে requests.get ফাংশনটি মক করা হয়েছে, যাতে বাহ্যিক API কলের পরিবর্তে একটি মক ডাটা রেসপন্স দেওয়া যায়।
Step 7: Handling Different Test Scenarios
আপনি বিভিন্ন ধরনের Test Scenarios তৈরি করতে পারেন, যেমন:
- Happy Path Tests: যেখানে সবকিছু ঠিকঠাক চলে।
- Error Handling Tests: যেখানে ভুল ইনপুট দেওয়া হয় এবং ত্রুটি ম্যানেজমেন্ট টেস্ট করা হয়।
- Boundary Tests: যেখানে ইনপুট সীমাবদ্ধতার পরীক্ষা করা হয়।
উদাহরণ: Error Handling Test
def test_invalid_input():
response = client.post("/items/", json={"name": "Laptop", "price": -500})
assert response.status_code == 422 # Unprocessable Entity
assert "detail" in response.json()
FastAPI তে Testing খুবই সহজ এবং কার্যকর। TestClient এবং pytest এর মাধ্যমে আপনি সহজেই FastAPI অ্যাপ্লিকেশন টেস্ট করতে পারেন, এবং ডিপেনডেন্সি ইনজেকশন, ডাটাবেস টেস্টিং, ফাইল টেস্টিং, এবং এক্সটার্নাল API মকিং সহ নানা ধরনের টেস্টিং পরিচালনা করতে পারেন। টেস্টিংয়ের মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনকে আরও শক্তিশালী, নিরাপদ এবং বাগ-মুক্ত রাখতে পারেন।
FastAPI-তে Unit Testing তৈরি করা খুবই সহজ এবং কার্যকর। FastAPI-তে Unit Test লেখার জন্য সাধারণত pytest ব্যবহার করা হয়। TestClient ব্যবহার করে আমরা FastAPI অ্যাপ্লিকেশনের এন্ডপয়েন্টগুলোর টেস্ট করতে পারি, যা আমাদের অটোমেটিকভাবে রিকোয়েস্ট পাঠাতে এবং রেসপন্স যাচাই করতে সহায়ক।
এই গাইডে, আমরা দেখব কিভাবে FastAPI অ্যাপ্লিকেশনের জন্য Unit Test তৈরি করা যায়।
Step 1: প্রয়োজনীয় লাইব্রেরি ইনস্টল করা
Unit Testing এর জন্য আপনাকে কিছু লাইব্রেরি ইনস্টল করতে হবে:
- pytest: টেস্টিং ফ্রেমওয়ার্ক
- httpx: HTTP রিকোয়েস্ট পাঠানোর জন্য (TestClient সহ FastAPI-তে ব্যবহার করা হয়)
pip install pytest httpx
Step 2: FastAPI অ্যাপ তৈরি করা
প্রথমে একটি সহজ FastAPI অ্যাপ তৈরি করি, যাতে টেস্টিং করা যাবে।
উদাহরণ: FastAPI অ্যাপ
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id}
এটি একটি সাধারণ FastAPI অ্যাপ যেখানে দুটি GET এন্ডপয়েন্ট রয়েছে:
/: একটি সাধারণ রুট এন্ডপয়েন্ট যা একটি বার্তা ফেরত দেয়।/items/{item_id}: একটি ডাইনামিক রাউট যাitem_idপ্যারামিটার গ্রহণ করে।
Step 3: Unit Test তৈরি করা
এখন আমরা pytest ব্যবহার করে এই FastAPI অ্যাপের জন্য Unit Test তৈরি করব। TestClient এর সাহায্যে FastAPI অ্যাপের এন্ডপয়েন্টগুলোকে টেস্ট করা যাবে।
টেস্ট ফাইল তৈরি করা
from fastapi.testclient import TestClient
from app import app # FastAPI অ্যাপের ইনস্ট্যান্স
client = TestClient(app)
def test_read_root():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Hello, World!"}
def test_read_item():
response = client.get("/items/42")
assert response.status_code == 200
assert response.json() == {"item_id": 42}
এখানে:
test_read_root:/এন্ডপয়েন্টে একটি GET রিকোয়েস্ট পাঠানো হচ্ছে এবং রেসপন্সের স্ট্যাটাস কোড এবং কন্টেন্ট চেক করা হচ্ছে।test_read_item:/items/{item_id}এন্ডপয়েন্টে একটি GET রিকোয়েস্ট পাঠানো হচ্ছে এবংitem_idচেক করা হচ্ছে।
Step 4: টেস্ট চালানো
এখন আপনি pytest ব্যবহার করে টেস্টগুলো চালাতে পারেন। টেস্ট ফাইলটি যদি test_app.py নামে থাকে, তাহলে নিচের কমান্ডটি ব্যবহার করুন:
pytest test_app.py
টেস্টের আউটপুট:
================================ test session starts ================================
collected 2 items
test_app.py .. [100%]
================================ 2 passed in 0.12 seconds ==========================
এখানে, দুটি টেস্টই সফলভাবে পাস করেছে।
Step 5: Error Handling Test
FastAPI অ্যাপ্লিকেশনে Error Handling টেস্ট করা খুবই গুরুত্বপূর্ণ। এখানে একটি উদাহরণ দেওয়া হল যেখানে ভুল item_id পাঠানো হলে অ্যাপ একটি ত্রুটি ফিরিয়ে দেবে।
টেস্টে Error Handling
def test_read_item_not_found():
response = client.get("/items/9999") # এমন একটি ID পাঠানো হচ্ছে যা নেই
assert response.status_code == 404 # 404 Not Found হওয়া উচিত
এখানে /items/9999 পাথে একটি ID পাঠানো হচ্ছে যা বিদ্যমান নেই, তাই FastAPI 404 ত্রুটি ফেরত দেবে।
Step 6: Testing with Query Parameters
FastAPI অ্যাপ্লিকেশনে Query Parameters টেস্ট করা ও বেশ সহজ।
উদাহরণ: Query Parameter সহ রাউট
@app.get("/items/")
def read_items(q: str = None):
return {"query": q}
টেস্ট:
def test_read_items():
response = client.get("/items/?q=test_query")
assert response.status_code == 200
assert response.json() == {"query": "test_query"}
এখানে q=test_query কোয়েরি প্যারামিটার পাঠানো হয়েছে এবং রেসপন্সে সেই কোয়েরি ভ্যালু চেক করা হচ্ছে।
Step 7: Dependency Injection Testing
FastAPI তে Dependency Injection এর মাধ্যমে ফাংশন বা ক্লাসের মধ্যে নির্দিষ্ট ডিপেনডেন্সি ইনজেক্ট করা যায়। Unit Testing এ এটি পরীক্ষা করার জন্য FastAPI-তে TestClient ব্যবহার করে Dependencies ইনজেক্ট করা হয়।
উদাহরণ: Dependency Injection
from fastapi import Depends
def get_query_param(q: str = None):
return q
@app.get("/items/")
def read_item_with_dependency(query: str = Depends(get_query_param)):
return {"query": query}
টেস্ট:
def test_read_item_with_dependency():
response = client.get("/items/?q=test_query")
assert response.status_code == 200
assert response.json() == {"query": "test_query"}
এখানে, Depends ডিপেনডেন্সি ফাংশনটি get_query_param টেস্ট করা হচ্ছে।
Step 8: Async Function Testing
FastAPI অ্যাপ্লিকেশনগুলো Asynchronous কাজ করে থাকে। আপনি TestClient ব্যবহার করে async এন্ডপয়েন্টগুলোর টেস্টও করতে পারেন।
উদাহরণ: Async Function
@app.get("/async-items/")
async def async_read_item():
return {"message": "This is an async item"}
টেস্ট:
def test_async_read_item():
response = client.get("/async-items/")
assert response.status_code == 200
assert response.json() == {"message": "This is an async item"}
FastAPI-তে Unit Testing তৈরি করা সহজ এবং কার্যকর। pytest এবং TestClient ব্যবহার করে আপনি অ্যাপের বিভিন্ন এন্ডপয়েন্ট, রিকোয়েস্ট, রেসপন্স, ডিপেনডেন্সি, এবং এরর হ্যান্ডলিং চেক করতে পারেন। FastAPI স্বয়ংক্রিয়ভাবে রিকোয়েস্ট এবং রেসপন্স প্রক্রিয়া পরিচালনা করে, যা Unit Testing কে আরও সহজ ও মডুলার করে তোলে।
FastAPI এর টেস্টিং খুবই সহজ এবং কার্যকর। Pytest হল Python-এর একটি জনপ্রিয় টেস্টিং লাইব্রেরি যা FastAPI-র সাথে ইন্টিগ্রেট করা যায়। FastAPI নিজে TestClient সরবরাহ করে, যা দিয়ে আমরা API রিকোয়েস্ট করতে পারি এবং টেস্ট করতে পারি। Pytest ব্যবহার করে আমরা FastAPI অ্যাপের জন্য স্বয়ংক্রিয় টেস্ট তৈরি করতে পারি।
এখানে আমরা দেখব FastAPI অ্যাপের জন্য কীভাবে Pytest ব্যবহার করে টেস্ট করা যায়।
Step 1: প্যাকেজ ইনস্টল করা
প্রথমে pytest এবং httpx ইনস্টল করতে হবে, যা FastAPI এর সাথে টেস্ট করার জন্য ব্যবহৃত হয়।
pip install pytest httpx
এছাড়া, আপনি FastAPI এবং Uvicorn (FastAPI অ্যাপ চালানোর জন্য) ইনস্টল করে রাখবেন।
pip install fastapi uvicorn
Step 2: FastAPI অ্যাপ তৈরি করা
আমরা একটি সাধারণ FastAPI অ্যাপ তৈরি করব এবং তার পর Pytest ব্যবহার করে এর টেস্ট তৈরি করব।
উদাহরণ: FastAPI অ্যাপ
# main.py
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str | None = None
price: float
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price}
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id}
এখানে, আমরা দুটি রাউট তৈরি করেছি:
- POST
/items/- একটি আইটেম তৈরি করা এবং তার নাম ও দাম ফেরত দেওয়া। - GET
/items/{item_id}- একটি আইটেমেরitem_idফেরত দেওয়া।
Step 3: Pytest টেস্ট তৈরি করা
এখন Pytest ব্যবহার করে এই রাউটগুলোর জন্য টেস্ট তৈরি করা হবে। আমরা TestClient ব্যবহার করে অ্যাপের HTTP রিকোয়েস্ট পরীক্ষা করব।
উদাহরণ: Pytest টেস্ট ফাইল
# test_main.py
from fastapi.testclient import TestClient
from main import app
client = TestClient(app)
def test_create_item():
response = client.post("/items/", json={"name": "Laptop", "price": 1000.0})
assert response.status_code == 200
assert response.json() == {"item_name": "Laptop", "item_price": 1000.0}
def test_read_item():
response = client.get("/items/123")
assert response.status_code == 200
assert response.json() == {"item_id": 123}
এখানে দুটি টেস্ট ফাংশন তৈরি করা হয়েছে:
test_create_item: এটি POST রিকোয়েস্টের মাধ্যমে একটি নতুন আইটেম তৈরি করে এবং সঠিক রেসপন্স যাচাই করে।test_read_item: এটি GET রিকোয়েস্টের মাধ্যমে একটি নির্দিষ্ট আইটেম পড়ে এবং সঠিক রেসপন্স যাচাই করে।
Step 4: টেস্ট রান করা
এখন আমরা Pytest ব্যবহার করে টেস্ট রান করব।
pytest test_main.py
এটি test_main.py ফাইলের সব টেস্ট ফাংশন চালাবে এবং রেজাল্ট দেখাবে।
টেস্ট আউটপুট (সফল টেস্ট):
================================= test session starts ================================
collected 2 items
test_main.py .. [100%]
================================== 2 passed in 0.12 seconds ================================
এখানে, দুটি টেস্টই সফলভাবে সম্পন্ন হয়েছে।
Step 5: টেস্টে Additiional Fixtures ব্যবহার করা
Fixtures ব্যবহার করে আপনি ডাটাবেস সংযোগ বা অন্যান্য রিসোর্স প্রস্তুতি নিতে পারেন, যা টেস্টের জন্য প্রয়োজন হতে পারে। FastAPI এর সাথে Pytest-এ Fixtures ব্যবহারের একটি উদাহরণ:
উদাহরণ: Fixture তৈরি
# test_main.py
import pytest
from fastapi.testclient import TestClient
from main import app
@pytest.fixture(scope="module")
def client():
with TestClient(app) as c:
yield c
def test_create_item(client):
response = client.post("/items/", json={"name": "Laptop", "price": 1000.0})
assert response.status_code == 200
assert response.json() == {"item_name": "Laptop", "item_price": 1000.0}
def test_read_item(client):
response = client.get("/items/123")
assert response.status_code == 200
assert response.json() == {"item_id": 123}
এখানে, client নামের একটি Fixture তৈরি করা হয়েছে, যা টেস্ট চলাকালীন FastAPI অ্যাপ্লিকেশনের জন্য TestClient প্রদান করবে। scope="module" এর মাধ্যমে এই Fixture শুধুমাত্র একবার পুরো টেস্ট মডিউলে ব্যবহার হবে।
Step 6: Error Handling টেস্ট করা
আপনি FastAPI তে Error Handling পরীক্ষা করেও নিশ্চিত করতে পারেন যে, অ্যাপ্লিকেশন সঠিকভাবে ত্রুটি দেখাচ্ছে।
উদাহরণ: Error Handling টেস্ট
# test_main.py
def test_create_item_invalid_data(client):
response = client.post("/items/", json={"name": "Laptop"})
assert response.status_code == 422 # 422 Unprocessable Entity
assert response.json()["detail"][0]["msg"] == "field required"
এখানে, আমরা একটি POST রিকোয়েস্ট পাঠাচ্ছি যা price প্যারামিটারটি অনুপস্থিত, এবং টেস্ট নিশ্চিত করে যে 422 Unprocessable Entity ত্রুটি কোড এবং সঠিক ত্রুটি বার্তা ফেরত আসছে।
FastAPI এবং Pytest ব্যবহারের মাধ্যমে আপনি আপনার API-এর জন্য খুব সহজে এবং কার্যকরভাবে টেস্ট তৈরি করতে পারেন। FastAPI এর TestClient এর সাহায্যে HTTP রিকোয়েস্ট পাঠানো এবং রেসপন্স যাচাই করা সম্ভব, এবং Pytest এর মাধ্যমে স্বয়ংক্রিয় টেস্ট তৈরি করা যেতে পারে যা কোডের কার্যক্ষমতা নিশ্চিত করে। Pytest-এ Fixtures ব্যবহার করে আপনি ডাটাবেস সংযোগ বা অন্যান্য নির্ভরশীলতা ইনজেক্ট করতে পারেন এবং টেস্টের দক্ষতা বাড়াতে পারেন।
FastAPI তে TestClient ব্যবহার করে সহজেই API টেস্ট করা যায়। FastAPI নিজেই TestClient ক্লাস সরবরাহ করে, যা httpx লাইব্রেরির উপর ভিত্তি করে কাজ করে। এই ক্লাসটি API এন্ডপয়েন্টগুলোকে ইন-মেমোরি রান করায় এবং অ্যাপ্লিকেশনটির সাথে HTTP রিকোয়েস্ট পাঠিয়ে টেস্ট করতে সক্ষম করে।
এখানে FastAPI অ্যাপ্লিকেশনের API টেস্ট করার জন্য TestClient কিভাবে ব্যবহার করা হয় তা ব্যাখ্যা করা হলো।
Step 1: প্রয়োজনীয় লাইব্রেরি ইনস্টল করা
FastAPI এবং httpx লাইব্রেরি ইনস্টল করতে হবে। httpx হল FastAPI-র জন্য ব্যবহৃত HTTP ক্লায়েন্ট।
pip install fastapi httpx pytest
এখানে, pytest হলো টেস্টিং ফ্রেমওয়ার্ক যা FastAPI-এর সাথে ব্যবহৃত হয়।
Step 2: FastAPI অ্যাপ তৈরি করা
প্রথমে একটি FastAPI অ্যাপ তৈরি করা যাক।
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id}
@app.post("/items/")
def create_item(name: str):
return {"name": name, "message": "Item created"}
এখানে:
GET /items/{item_id}: একটি ডাইনামিক পাথ প্যারামিটারitem_idনিয়ে ইনপুট গ্রহণ করবে।POST /items/: একটি স্ট্রিংnameনিয়ে ইনপুট গ্রহণ করবে এবং একটি নতুন আইটেম তৈরি করবে।
Step 3: API টেস্ট করার জন্য TestClient ব্যবহার করা
FastAPI-তে API টেস্ট করার জন্য TestClient ব্যবহার করা হয়। নিচে কিভাবে TestClient ব্যবহার করতে হয় তা দেখানো হলো।
টেস্ট ফাইল তৈরি করা
এখন একটি টেস্ট ফাইল তৈরি করি, যেমন test_main.py, যেখানে TestClient ব্যবহার করে API টেস্ট করা হবে।
from fastapi.testclient import TestClient
from main import app # এখানে main.py ফাইলের অ্যাপটি ইমপোর্ট করতে হবে
client = TestClient(app)
# GET রিকোয়েস্ট টেস্ট
def test_read_item():
response = client.get("/items/42")
assert response.status_code == 200
assert response.json() == {"item_id": 42}
# POST রিকোয়েস্ট টেস্ট
def test_create_item():
response = client.post("/items/", json={"name": "Laptop"})
assert response.status_code == 200
assert response.json() == {"name": "Laptop", "message": "Item created"}
ব্যাখ্যা:
TestClient: FastAPI অ্যাপ্লিকেশনের HTTP রিকোয়েস্ট পাঠাতে ব্যবহৃত হয়। এটি স্বয়ংক্রিয়ভাবে অ্যাপ্লিকেশনকে ইন-মেমোরি চালায়, যাতে টেস্টিং করা সহজ হয়।client.get(): একটি GET রিকোয়েস্ট পাঠানোর জন্য ব্যবহার করা হয়। এতে পাথ প্যারামিটারitem_id=42প্রেরণ করা হয়েছে।client.post(): একটি POST রিকোয়েস্ট পাঠানোর জন্য ব্যবহার করা হয়। এটি একটি JSON ডাটা পাঠায়, যেমন{ "name": "Laptop" }।
রেসপন্স যাচাই:
assert response.status_code == 200: রেসপন্স কোডের মান সঠিক কিনা যাচাই করা।assert response.json() == ...: রেসপন্স JSON ডাটা সঠিক কিনা যাচাই করা।
Step 4: টেস্ট চালানো
আপনি pytest ব্যবহার করে টেস্টগুলো চালাতে পারেন। টেস্ট চালানোর জন্য নিচের কমান্ডটি ব্যবহার করুন:
pytest test_main.py
এটি আপনার টেস্ট ফাইলটি চালাবে এবং প্রতিটি ফাংশনের জন্য ফলাফল দেখাবে।
Step 5: টেস্টের আউটপুট
pytest টেস্ট চালানোর পর আউটপুট কিছুটা এইরকম হতে পারে:
$ pytest test_main.py
============================= test session starts ==============================
collected 2 items
test_main.py .. [100%]
============================== 2 passed in 0.03 seconds ==============================
এখানে দুটি টেস্টই সফলভাবে পাস করেছে।
Step 6: অন্যান্য টেস্ট কেস
১. Bad Request Error Handling:
এখন, যদি আমরা POST /items/ এ ভুল ইনপুট পাঠাই, তাহলে 400 Bad Request রেসপন্স আসবে।
def test_create_item_invalid_data():
response = client.post("/items/", json={"wrong_field": "Laptop"})
assert response.status_code == 422 # 422 Unprocessable Entity
এখানে, ইনপুট ফিল্ডের নাম সঠিক না হওয়ায় 422 Unprocessable Entity ত্রুটি আসবে।
২. Testing Query Parameters:
যদি আপনি Query Parameters ব্যবহার করেন, তাহলে তাদেরও টেস্ট করা যায়।
@app.get("/search/")
def search_items(query: str):
return {"query": query}
def test_search_items():
response = client.get("/search/?query=fastapi")
assert response.status_code == 200
assert response.json() == {"query": "fastapi"}
এখানে GET /search/ এ query প্যারামিটার ব্যবহার করে টেস্ট করা হয়েছে।
FastAPI তে TestClient ব্যবহার করে API টেস্টিং খুবই সহজ এবং কার্যকর। TestClient ইন-মেমোরি অ্যাপ্লিকেশন রান করে এবং HTTP রিকোয়েস্ট পাঠানোর মাধ্যমে API ফাংশনালিটি টেস্ট করতে দেয়। pytest-এর মাধ্যমে আপনি সহজেই একাধিক টেস্ট কেস চালাতে পারেন এবং অ্যাপ্লিকেশনের বিভিন্ন এন্ডপয়েন্টের সঠিকতা যাচাই করতে পারেন। এটি ডেভেলপারদের জন্য একটি অত্যন্ত কার্যকর টুল, যা API ডেভেলপমেন্ট এবং মেইনটেন্যান্সকে আরও সহজ করে তোলে।
FastAPI তে Integration Testing এবং Async Testing সেটআপ করা একটি গুরুত্বপূর্ণ অংশ, যেটি অ্যাপ্লিকেশনের কার্যকারিতা এবং নির্ভরযোগ্যতা নিশ্চিত করতে সহায়ক। এখানে আমরা দেখব কিভাবে FastAPI এ Integration Testing এবং Async Testing কনফিগার করতে হয়।
Step 1: টেস্টিং লাইব্রেরি ইনস্টল করা
FastAPI তে টেস্টিং করার জন্য সাধারণত pytest এবং httpx ব্যবহার করা হয়। httpx লাইব্রেরি FastAPI-র async ফিচারগুলো সাপোর্ট করে এবং HTTP রিকোয়েস্টের মাধ্যমে অ্যাপ্লিকেশনের পরীক্ষা করতে সহায়ক হয়।
pip install pytest httpx
Step 2: FastAPI অ্যাপ তৈরি করা
ফাস্টএপিআই অ্যাপ্লিকেশনের জন্য টেস্টিং সেটআপ করার আগে একটি সাধারণ FastAPI অ্যাপ তৈরি করি।
উদাহরণ: FastAPI অ্যাপ
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.post("/items/")
async def create_item(item: Item):
return {"name": item.name, "price": item.price}
এখানে, /items/ এন্ডপয়েন্ট একটি POST রিকোয়েস্ট গ্রহণ করে এবং একটি Item নামক মডেল ফেরত দেয়।
Step 3: Integration Testing
Integration Testing হল এমন একটি প্রক্রিয়া যেখানে পুরো সিস্টেমের কাজ পরীক্ষা করা হয়, যাতে নিশ্চিত হওয়া যায় যে বিভিন্ন অংশ একসাথে সঠিকভাবে কাজ করছে। FastAPI তে integration testing করার জন্য TestClient ব্যবহার করা হয়, যা অ্যাপ্লিকেশনের HTTP রিকোয়েস্ট ও রেসপন্স সিমুলেট করতে সহায়ক।
উদাহরণ: Integration Test
from fastapi.testclient import TestClient
from app import app # আপনার FastAPI অ্যাপ্লিকেশনের অবজেক্ট এখানে ব্যবহার করুন
client = TestClient(app)
def test_create_item():
response = client.post("/items/", json={"name": "Laptop", "price": 1500.00})
assert response.status_code == 200
assert response.json() == {"name": "Laptop", "price": 1500.00}
ব্যাখ্যা:
TestClient: FastAPI অ্যাপ্লিকেশনের জন্য HTTP ক্লায়েন্ট তৈরি করে যাGET,POST,PUT,DELETEরিকোয়েস্ট পাঠাতে সাহায্য করে।client.post(): এটি POST রিকোয়েস্ট পাঠানোর জন্য ব্যবহার করা হয় এবংjsonপ্যারামিটার দিয়ে রিকোয়েস্ট বডি পাঠানো হয়।assert: এটি রেসপন্সের স্ট্যাটাস কোড এবং কন্টেন্ট যাচাই করার জন্য ব্যবহৃত হয়।
টেস্ট রান করা:
pytest test_app.py
Step 4: Async Testing কনফিগার করা
FastAPI অ্যাপ্লিকেশন async ফিচার ব্যবহার করে, তাই async ফাংশনগুলির জন্য async test cases তৈরি করতে হবে। এজন্য pytest-asyncio প্লাগইন ব্যবহার করা হয়।
উদাহরণ: Async Test Setup
প্রথমে, pytest-asyncio ইনস্টল করতে হবে:
pip install pytest-asyncio
উদাহরণ: Async Test Case
import pytest
from httpx import AsyncClient
from app import app # আপনার FastAPI অ্যাপ্লিকেশনের অবজেক্ট
@pytest.mark.asyncio
async def test_create_item_async():
async with AsyncClient(app=app, base_url="http://test") as client:
response = await client.post("/items/", json={"name": "Laptop", "price": 1500.00})
assert response.status_code == 200
assert response.json() == {"name": "Laptop", "price": 1500.00}
ব্যাখ্যা:
AsyncClient: এটিhttpxথেকে আসছে এবং FastAPI অ্যাপ্লিকেশনের সাথে অ্যাসিঙ্ক্রোনাস HTTP রিকোয়েস্ট পাঠাতে ব্যবহৃত হয়।@pytest.mark.asyncio: এটি নিশ্চিত করে যে টেস্টটি async ফাংশন হিসেবে রান করবে।await: অ্যাসিঙ্ক্রোনাস রিকোয়েস্ট করার জন্যawaitব্যবহৃত হয়।
টেস্ট রান করা:
pytest test_app.py
Step 5: Test Database Integration (Optional)
Integration Testing যখন ডাটাবেসের সাথে যুক্ত হয়, তখন আপনাকে একটি test database ব্যবহার করতে হবে যাতে প্রোডাকশন ডাটাবেসে কোন পরিবর্তন না হয়। FastAPI তে ডাটাবেসের সাথে integration testing করার জন্য SQLAlchemy বা Databases লাইব্রেরি ব্যবহার করতে পারেন।
উদাহরণ: Test Database Configuration
from databases import Database
import pytest
from app import app # আপনার FastAPI অ্যাপ্লিকেশনের অবজেক্ট
from fastapi.testclient import TestClient
# ডাটাবেস URL
DATABASE_URL = "sqlite:///./test.db"
# ডাটাবেস কনফিগারেশন
database = Database(DATABASE_URL)
@app.on_event("startup")
async def startup():
await database.connect()
@app.on_event("shutdown")
async def shutdown():
await database.disconnect()
client = TestClient(app)
@pytest.fixture
def setup_database():
# এখানে আপনি টেস্ট ডাটাবেসের জন্য প্রয়োজনীয় টেবিল তৈরি করতে পারেন
pass
def test_create_item_with_db(setup_database):
response = client.post("/items/", json={"name": "Laptop", "price": 1500.00})
assert response.status_code == 200
assert response.json() == {"name": "Laptop", "price": 1500.00}
Step 6: Test Cleanup
Test Cleanup প্রক্রিয়া নিশ্চিত করে যে টেস্টের পরে ডাটাবেস বা অন্যান্য রিসোর্স ক্লিন করা হয়েছে, যাতে পরবর্তী টেস্টে সমস্যা না হয়।
উদাহরণ: Test Cleanup
import pytest
from databases import Database
# টেস্টের পরে ডাটাবেস ক্লিন করা
@pytest.fixture(scope="function", autouse=True)
async def cleanup_db():
# ডাটাবেস ক্লিনআপের কোড এখানে হবে
yield
# টেস্ট ডাটাবেস ক্লিনআপ কোড এখানে হবে
FastAPI তে Integration Testing এবং Async Testing অত্যন্ত গুরুত্বপূর্ণ টুল যা অ্যাপ্লিকেশনের কার্যকারিতা এবং নির্ভরযোগ্যতা পরীক্ষা করার জন্য ব্যবহৃত হয়। pytest এবং httpx ব্যবহার করে আপনি সহজেই async ও sync টেস্ট কেস লিখে আপনার অ্যাপ্লিকেশন পরীক্ষা করতে পারেন। টেস্টিং ব্যবস্থাপনা FastAPI অ্যাপ্লিকেশন ডেভেলপমেন্টের একটি গুরুত্বপূর্ণ অংশ, যা কোডের গুণগত মান বজায় রাখতে সাহায্য করে।
Read more